package demo5;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @Component注解，被其标注后，Spring容器扫描其所在包时就会将其纳入到Spring容器中进行管理
 * 除了上述注解外，Spring框架还提供了其他注解:
 * @Repository:该注解也可以让当前类被Spring容器管理，这个注解通常标注数据持久层中的类(与数据库打交道的类)
 * @Service:同样受Spring容器管理，这个注解常用于处理业务逻辑的(业务层)类
 * @Controller:这个注解通常用来标注Controller类(与客户端打交道，控制器层,在SpringMVC框架中使用)
 */
@Component
//@Repository
//@Service
//@Controller
public class Person {
    /*
        @Autowired是Spring容器提供的注解，用于进行自动装配，完成依赖的注入

        @Resource注解，这个注解是java原生提供的注解，也被Spring容器支持，用于完成依赖注入
        该注解默认也是通过类型匹配来完成依赖注入的，同样的，如果找到多个可匹配的对象，容器依然
        会抛出异常。例如:同时找到了Shirt,Sweater两个类

        @Resource注解的另一种装配机制，基于类名
        用法
            @Resource(name="类名")
            通过向注解中name参数传递类名来指定要装配的对象。
            这里需要注意的是，【类名的首字母是小写的】
        例如:
            @Resource(name = "shirt")  装配的就是Shirt这个类，不需要指定包名
            @Resource(name = "sweater") 装配的就是Sweater
            还要注意，这里指定类名后，这个类要被Spring容器管理
        缺点:由于这里装配时指定的是类的名字，这就导致了依赖的类名定死不能修改。

        @Resource注解基于属性名的装配形式
        用法:
            @Resource
            private Clothes sweater;   这里属性名与类名一致即可，注意还是首字母小写，此时装配Sweater这个类的实例

            @Resource
            private Clothes shirt;  此时会装配Shirt这个类的实例

        缺点:同样，限制了依赖类的类名
     */
//    @Autowired

//    @Resource
//    @Resource(name = "sweater")
//    @Resource(name = "shirt")
//    private Clothes clothes;

    @Resource
//    private Clothes sweater;
    private Clothes shirt;

    public void play(){
//        clothes.wear();

//        sweater.wear();
        shirt.wear();
        System.out.println("出去玩!");
    }
}
